개념정리

다음 3가지 회귀분석 모형에 대해 질문을 읽고 답하세요. (m은 더미변수)

모형1: y = ax + bm + d
모형2: y = ax + cmx + d
모형3: y = ax + bm + cmx + d

  1. 모형 1에서 x가 1 증가하면 y는 얼마만큼 증가합니까?
    a
  2. 모형 1에서 m = 0인 경우와 m = 1인 경우의 그래프는
    평행하다
  3. 모형 1에서 m = 0인 경우와 m = 1인 경우 절편은 얼마만큼 차이가 납니까?
    b
  4. 모형 2에서 x가 1 증가하면 y는 얼마만큼 증가합니까?
    m에 따라 다르다
  5. 모형 1에서 m = 0인 경우와 m = 1인 경우의 그래프는
    평행하지 않다
  6. 모형 1에서 m = 0인 경우와 m = 1인 경우의 절편은
    같다
  7. 모형 3에서 m = 0인 경우, x가 1 증가하면 y는 얼마만큼 증가합니까?
    a
  8. 모형 3에서 m = 1인 경우, x가 1 증가하면 y는 얼마만큼 증가합니까?
    a + c
  9. 모형 3에서 계수 c는 무엇을 나타냅니까?
    m = 0인 경우와 m = 1인 경우의 기울기 차이
  10. 모형 3에서 계수 b는 무엇을 나타냅니까?
    m = 0인 경우와 m = 1인 경우의 절편 차이

증거의 사다리 levels of evidence ladder

각각의 기법이 주는 증거의 수준

더 높은 수준의 기법이 주는 결과는 더 진실에 가까움

  • 실험적 통제
  • 무작위 대조군
  • 준실험
  • 반사실

실험적 통제

처치를 제외한 다른 모든 조건을 동일하게 유지

인과관계를 확인할 수 있는 최선의 조건

주로 물리학, 화학 등에서 가능

무작위 대조군

모든 조건을 완벽하게 통제할 수 없을 경우, 실험군과 대조군에 무작위로 할당

충분히 큰 표본에서는 두 집단이 유사할 것

생물학, 사회과학 등에서 가능

→ 사람들의 동의를 얻기 어려워 무작위 대조군 방법은 사실상 어려움 (예, 코로나 바이러스 해독약 생체실험)

준실험 quasi-experiment

대조군이 없거나 무작위 할당이 되지 않았지만 실험과 비슷한 상황

자연적으로 무작위 할당과 비슷한 결과가 생긴 경우
예, TV 광고를 랜덤하게 송출하는 건 불가능 → 동네별로 차이두기(충북 충남은 큰 차이가 없으니, 두 지역에서 다른 광고 틀기)

이중차분법 등의 기법을 통해 분석

반사실 counterfactural

순수한 관찰 결과만을 가지고 인과관계를 추측 (반사실적 추론)

어떤 일이 벌어지지 않았을 때 일어질 있을 예측하는 모형이 필요

모형의 예측과 실제의 결과를 비교하여 영향력을 도출

A/B Test가 어려우면 준실험이라도, 준실험이 어려우면 반사실이라도!

이중차분법

(=상호작용)

횡단비교 cross-sectional

동일 시점에 다른 대상이나 집단을 비교

집단A 집단B 횡단비교
시점 1 A1 B1 A1 - B1
시점 2 A2 B2 A2 - B2

종단비교 longitudinal

같은 대상을 다른 시점간 비교

집단A 집단B 횡단비교
시점 1 A1 B1 A1 - B1
시점 2 A2 B2 A2 - B2
종단비교 A2 - A1 B2 - B1

이중차분법 Difference in Differences

실험이 불가능한 상황에서 사용하는 준실험적 방법

실험군 A에 어떠한 처치를 했으나 대조군 B가 없을 때

A와 비슷한 집단 B를 이용하여 비교

집단A 집단B 횡단비교
시점 1 A1 B1 A1 - B1
시점 2 A2 B2 A2 - B2
종단비교 A2 - A1 B2 - B1 (A2 - A1) - (B2 - B1)

"두 집단이 비슷한 추세를 나타내야 하는데, 한 집단이 두드러진 차이를 보인다면 그것이 처치한 것의 효과"

이중차분법의 결과해석

$$ d = (A2 − A1) − (B2 − B1) $$

d = 0 : 실험군 A에서 변화는 대조군 B에서 변화와 비슷 (처치 효과 없음)

d != 0 : 실험군 A에서 대조군 B보다 큰 변화과 관찰 (처치 효과 있음)

평행 추세의 가정 parallel trend assumption

처치 효과가 없다면 실험군 A와 대조군 B가 비슷하게 변할 것이라고 가정

이러한 가정이 성립하지 않는다면 이중차분법 적용이 불가능

가능한 A와 비슷한 B를 비교하는 것이 중요

graph

회귀분석을 통한 이중차분법

상호작용을 통해 분석

$$ Y = a ⋅ GROUP + b ⋅ POINT + d ⋅ (GROUP × POINT) + e $$
  • GROUP: 집단A (1), 집단B (0)
  • POINT: 처치 전(0), 후(1)
  • a : 처치 전부터 존재하던 집단 간의 차이 (= A1 − B1)
  • b : 처치 전후의 시점 간 차이에 따른 변화 (= B2 − B1)
  • d : 처치 효과

대입해보기

$$ Y = a ⋅ GROUP + b ⋅ POINT + d ⋅ (GROUP × POINT) + e $$
A(GROUP=1) B(GROUP=0) 횡단비교
전(POINT=0) a + e e a
후(POINT=1) a + b + d + e b + e a + d
종단비교 b + d b d

Card & Krueger (1994)

1992년 미국 뉴저지 주는 최저임금을 시간당 4.25달러에서 5.05달러로 인상

이웃 펜실베니아 주는 4.25달러 최저임금을 유지

두 주 경계에 위치한 패스트푸드 음식점을 대상으로 설문조사 실시

최저임금 상승이 사람을 고용에 미치는 영향을 측정

분석

In [1]:
import pandas as pd
In [2]:
df = pd.read_excel('njmin3.xlsx')
In [3]:
df.head()
Out[3]:
CO_OWNED SOUTHJ CENTRALJ PA1 PA2 DEMP nj bk kfc roys wendys d d_nj fte
0 0 0 1 0 0 12.00 1 1 0 0 0 0 0 15.00
1 0 0 1 0 0 6.50 1 1 0 0 0 0 0 15.00
2 0 0 1 0 0 -1.00 1 0 0 1 0 0 0 24.00
3 1 0 0 0 0 2.25 1 0 0 1 0 0 0 19.25
4 0 0 0 0 0 13.00 1 1 0 0 0 0 0 21.50
  • fte : 풀타임 노동시간
  • nj: 뉴저지(1), 펜실베니아(0)
  • d : 최저임금 인상 전(0), 후(1)
  • nj * d : nj + d + nj:d 의 축약 표현

nj:d 의 계수를 통해 최저임금 인상이 고용에 미친 영향을 파악 가능

In [4]:
from statsmodels.formula.api import ols
In [5]:
ols('fte ~ nj * d', df).fit().summary()
Out[5]:
OLS Regression Results
Dep. Variable: fte R-squared: 0.007
Model: OLS Adj. R-squared: 0.004
Method: Least Squares F-statistic: 1.964
Date: Fri, 06 Nov 2020 Prob (F-statistic): 0.118
Time: 17:42:34 Log-Likelihood: -2904.2
No. Observations: 794 AIC: 5816.
Df Residuals: 790 BIC: 5835.
Df Model: 3
Covariance Type: nonrobust
coef std err t P>|t| [0.025 0.975]
Intercept 23.3312 1.072 21.767 0.000 21.227 25.435
nj -2.8918 1.194 -2.423 0.016 -5.235 -0.549
d -2.1656 1.516 -1.429 0.154 -5.141 0.810
nj:d 2.7536 1.688 1.631 0.103 -0.561 6.068
Omnibus: 218.742 Durbin-Watson: 1.842
Prob(Omnibus): 0.000 Jarque-Bera (JB): 804.488
Skew: 1.268 Prob(JB): 2.03e-175
Kurtosis: 7.229 Cond. No. 11.3


Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

y = - 2.9 nj - 2.2 d + 2.8 nj d + 23.3

뉴저지(nj=1) 펜실베니아(nj=0) 횡단비교
전(POINT=0) -2.9 + 23.3 23.3 -2.9
후(POINT=1) -2.9 - 2.2 + 2.8 + 23.3 - 2.2 + 23.3 -0.1
종단비교 +0.6 -2.2 +2.8

최저임금전에는 뉴저지가 펜실베니아보다 고용이 2.9정도 낮았는데, 최저임금을 올린 후에는 격차가 2.9에서 0.1 정도로 줄었다.

그러나 이 데이터만으로는 최저임금 인상이 고용이 늘어난다는 결론을 내릴 수 없다. 통계적으로 유의하지 않다. 최저임금 인상이 고용이 줄어들게 하지는 않는다는 결론 정도는 내릴 수 있다.

In [6]:
from matplotlib import pyplot
In [7]:
def y(nj,d):
    return 23.3312 - 2.8918 * nj + -2.1656 * d + 2.7536 * nj * d
In [8]:
x = [0, 1] # 가로축 지정
y_nj = [y(1,0), y(1,1)]
y_pen = [y(0,0), y(0,1)]
In [9]:
pyplot.plot(x, y_nj, 'r', y_pen, 'b--')
Out[9]:
[<matplotlib.lines.Line2D at 0x2a32d8eb888>,
 <matplotlib.lines.Line2D at 0x2a32d9709c8>]

이중차분법 실습

광고 전후 데이터 데이터에서,

group은 고객 집단을 나타냅니다. 광고집단 (1), 비교집단(0)

postAd는 광고 전(0), 후(1)를 나타냅니다.

sales는 매출액입니다.

광고 효과를 이중차분법으로 분석해보세요. 광고에 따른 매출액 변화는 얼마라고 할 수 있습니까?

In [10]:
df = pd.read_excel('postAd.xlsx')
In [11]:
df.head()
Out[11]:
sales postAd group
0 3.437521 0 0
1 2.866911 0 0
2 0.000000 0 0
3 0.915872 0 0
4 1.417902 0 0
In [12]:
ols('sales ~ postAd * group', df).fit().summary()
Out[12]:
OLS Regression Results
Dep. Variable: sales R-squared: 0.584
Model: OLS Adj. R-squared: 0.578
Method: Least Squares F-statistic: 91.71
Date: Fri, 06 Nov 2020 Prob (F-statistic): 4.05e-37
Time: 17:42:35 Log-Likelihood: -281.02
No. Observations: 200 AIC: 570.0
Df Residuals: 196 BIC: 583.2
Df Model: 3
Covariance Type: nonrobust
coef std err t P>|t| [0.025 0.975]
Intercept 2.0274 0.141 14.390 0.000 1.750 2.305
postAd 1.9897 0.199 9.986 0.000 1.597 2.383
group -0.0253 0.199 -0.127 0.899 -0.418 0.368
postAd:group 0.6186 0.282 2.195 0.029 0.063 1.174
Omnibus: 0.806 Durbin-Watson: 1.999
Prob(Omnibus): 0.668 Jarque-Bera (JB): 0.883
Skew: -0.056 Prob(JB): 0.643
Kurtosis: 2.694 Cond. No. 6.85


Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

y = -0.0253 group + 1.9897 postAd + 0.6186 postAd group + 2.0274

광고후(group=1) 광고전(group=0) 횡단비교
전(postAd=0) -0.0253 + 2.0274 2.0274 -0.0253
후(postAd=1) 1.9897 - 0.0253 + 0.6186 + 2.0274 1.9897 + 2.0274 - 0.0253 + 0.6186
종단비교 1.9897 + 0.6186 +1.9897 +0.6186

광고에 따른 매출액 변화는 0.6186이고, 이는 유의수준 5%에서 통계적으로 유의하다.

In [13]:
time = [0,1]
sales_no_ad = [2.0274, 4.0171] # 비교 그룹에서 [광고 전, 광고 후]
sales_ad = [2.0021, 4.6104] # 광고 그룹에서 [광고 전, 광고 후]
In [14]:
from matplotlib import pyplot
pyplot.plot(time, sales_no_ad, 'b--')
pyplot.plot(time, sales_ad, 'r')
Out[14]:
[<matplotlib.lines.Line2D at 0x2a32da49888>]

Casual Impact

구글에서 발표한 반사실적 인과 추론 모형

  • 베이지언
  • 여러 시점
  • 다양한 독립 변수
  • 변수 선택
  • 시계열
  • local trend: 단기적 방향성
  • seasonal effect: 주기적, 반복적인 패턴

ARIMA 모델은 추세가 일정할 때 쓰기 좋음. 그러나 매출, 고객 유입 데이터 등은 들쑥날쑥한 경향이 있어 이때 Casual Impact 활용.

설치하기

구글의 공식 버전은 R 패키지만 있음

비공식 Python 버전

pip install pycausalimpact

분석

In [15]:
from causalimpact import CausalImpact
In [16]:
df = pd.read_excel('causal_impact.xlsx')
In [17]:
df.head()
Out[17]:
sales x0 x1
0 200.472740 99.795292 88.434343
1 201.989349 100.663180 90.846551
2 199.254697 98.883699 89.205440
3 200.768831 100.448941 89.786098
4 201.444392 101.561734 89.709939
In [18]:
pyplot.plot(df['sales']) # 매출 추세 보기
Out[18]:
[<matplotlib.lines.Line2D at 0x2a32de26708>]
In [19]:
pre_period = [0,69] # 광고 이전 시점
post_period = [70,99] # 광고 이후 시점
ci = CausalImpact(df, pre_period, post_period)
  • df의 첫번째 컬럼이 종속변수, 나머지 컬럼은 독립변수
  • pre_period: 처치 또는 사건 이전의 기간
  • post_period: 이후 기간

분석 시 주의할 점

  • 한 집단만 존재해야 함
  • 데이터가 순서대로 있어야 함
  • 독립변수가 순서대로 있어야 함
  • 불필요한 데이터는 미리 제거해야 함

시각화

In [20]:
ci.plot()

그림 크기를 조절하려면 ci.plot(figsize=(12, 6)) 와 같이 지정

아래는 출력할 패널을 지정하는 법

  • original: 실제값 vs. 예측값
  • pointwise: 실제값 - 예측값 차이
  • cumulative: 차이의 누적
In [21]:
ci.plot(panels=['original', 'pointwise', 'cumulative'], figsize=(12,4))

요약

In [22]:
print(ci.summary())
Posterior Inference {Causal Impact}
                          Average            Cumulative
Actual                    205.99             6179.57
Prediction (s.d.)         201.03 (0.24)      6030.98 (7.13)
95% CI                    [200.58, 201.51]   [6017.26, 6045.21]

Absolute effect (s.d.)    4.95 (0.24)        148.59 (7.13)
95% CI                    [4.48, 5.41]       [134.37, 162.31]

Relative effect (s.d.)    2.46% (0.12%)      2.46% (0.12%)
95% CI                    [2.23%, 2.69%]     [2.23%, 2.69%]

Posterior tail-area probability p: 0.0
Posterior prob. of a causal effect: 100.0%

For more details run the command: print(impact.summary('report'))
  • Average: 평균
  • Cumulative: 누적
  • Actual: 실제값
  • Prediction: 예측값
  • Absolute effect: 절대 효과. 실제값 - 예측값
  • Relative effect: 상대 효과. 실제값 대비 절대 효과
  • Posterior tail-area probability p: p-value

설명

문장으로 풀어서 설명

In [23]:
print(ci.summary(output='report'))
Analysis report {CausalImpact}


During the post-intervention period, the response variable had
an average value of approx. 205.99. By contrast, in the absence of an
intervention, we would have expected an average response of 201.03.
The 95% interval of this counterfactual prediction is [200.58, 201.51].
Subtracting this prediction from the observed response yields
an estimate of the causal effect the intervention had on the
response variable. This effect is 4.95 with a 95% interval of
[4.48, 5.41]. For a discussion of the significance of this effect,
see below.


Summing up the individual data points during the post-intervention
period (which can only sometimes be meaningfully interpreted), the
response variable had an overall value of 6179.57.
By contrast, had the intervention not taken place, we would have expected
a sum of 6030.98. The 95% interval of this prediction is [6017.26, 6045.21].


The above results are given in terms of absolute numbers. In relative
terms, the response variable showed an increase of +2.46%. The 95%
interval of this percentage is [2.23%, 2.69%].


This means that the positive effect observed during the intervention
period is statistically significant and unlikely to be due to random
fluctuations. It should be noted, however, that the question of whether
this increase also bears substantive significance can only be answered
by comparing the absolute effect (4.95) to the original goal
of the underlying intervention.


The probability of obtaining this effect by chance is very small
(Bayesian one-sided tail-area probability p = 0.0).
This means the causal effect can be considered statistically
significant.

Causal Impact 실습

광고 매출 데이터를 CausalImpact로 분석해보세요(84 이후). 누적 절대 효과는 얼마입니까?

In [24]:
from causalimpact import CausalImpact
ad = pd.read_excel('campaign.xlsx')
ad.tail()
Out[24]:
y merry campaign ad_costs
103 71.196206 117.852100 0 50.137119
104 68.709176 118.222029 0 48.951964
105 69.698166 117.798286 0 49.947728
106 69.546206 119.057760 0 50.910935
107 71.881224 119.877817 0 52.513271
In [25]:
pyplot.plot(ad['ad_costs'])
Out[25]:
[<matplotlib.lines.Line2D at 0x2a32e275f48>]
In [26]:
pre_period = [0,83] # 광고 이전 시점
post_period = [84,107] # 광고 이후 시점
ci = CausalImpact(ad, pre_period, post_period)
In [27]:
print(ci.summary())
Posterior Inference {Causal Impact}
                          Average            Cumulative
Actual                    80.48              1931.51
Prediction (s.d.)         70.92 (0.42)       1702.08 (10.14)
95% CI                    [70.11, 71.77]     [1682.72, 1722.47]

Absolute effect (s.d.)    9.56 (0.42)        229.43 (10.14)
95% CI                    [8.71, 10.37]      [209.04, 248.79]

Relative effect (s.d.)    13.48% (0.6%)      13.48% (0.6%)
95% CI                    [12.28%, 14.62%]   [12.28%, 14.62%]

Posterior tail-area probability p: 0.0
Posterior prob. of a causal effect: 100.0%

For more details run the command: print(impact.summary('report'))

정답: 229.43

군집분석

비슷한 사례들끼리 군집cluster으로 모으는 것

대부분 군집의 수는 하이퍼파라미터로 정해주어야 함

비지도 학습 unsupervised learning

지도 학습: X → Y의 관계를 학습 (정답을 잘 예측해야 함)

비지도 학습: X의 내재적 구조를 학습 (정답이 없음)→action이 좋으면 잘 된거고 아니면...잘됐는지 아닌지 알 수 없음..

비지도 학습의 종류:

  • 군집 분석 clustering : 유사한 사례끼리 묶음
  • 차원 축소 dimensionality reduction : 데이터의 차원을 줄임

분류와 클러스터링의 차이

  • 로지스틱 회귀분석과 같은 분류에서는 각 사례의 범주가 관찰변수
  • 최소한 파라미터 추정 단계에서는 범주가 알려져 있음
  • 예측할 때는 모를 수도 있음
  • 클러스터링에서는 범주가 잠재변수

클러스터링의 종류

  • K-means
  • Affinity Propagation
  • Mean Shift
  • Spectral clustering
  • Hierarchical clustering
  • DBSCAN
  • OPTICS
  • Birch

k-Means

  • 가장 널리 사용되는 클러스터링 방법
  • k-Means는 k개의 평균이라는 뜻
  • 군집의 평균(중심점)을 구함
  • 사례를 중심점이 가장 가까운 군집에 포함시킴

k-Means의 특징

  • k만 정해주면 되므로 간단
  • 거리를 정할 수 있고, 중심점 주변에 사례들이 몰려있는 경우에 사용(연속변수가 많아야 좋음, 더미변수가 많으면 곤란..)
  • 소수의 사례만 무작위로 뽑아 클러스터링할 수도 있음(미니배치 kMeans)

Iris 데이터

!pip install plotly

In [28]:
import plotly.express as px
df = px.data.iris()
fig = px.scatter_3d(
    df, 
    x='sepal_length', 
    y='sepal_width', 
    z='petal_width', 
    color='petal_length')
fig.show()
In [29]:
df.head()
Out[29]:
sepal_length sepal_width petal_length petal_width species species_id
0 5.1 3.5 1.4 0.2 setosa 1
1 4.9 3.0 1.4 0.2 setosa 1
2 4.7 3.2 1.3 0.2 setosa 1
3 4.6 3.1 1.5 0.2 setosa 1
4 5.0 3.6 1.4 0.2 setosa 1

Python에서 k-Means

In [30]:
from sklearn.cluster import KMeans
col = ['sepal_length','sepal_width','petal_length','petal_width']
X = df[col]
kmeans = KMeans(n_clusters=2, random_state=0).fit(X) # 클러스터의 개수 지정
In [31]:
kmeans.labels_
Out[31]:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

k-Means 결과 시각화

In [32]:
# 위에서 클러스터의 개수를 2개로 했기 때문에 두 집단으로 묶어짐
fig = px.scatter_3d(
    df, 
    x='sepal_length', 
    y='sepal_width', 
    z='petal_width', 
    color=kmeans.labels_)
fig.show()

클러스터링 평가

사례들이 군집의 중심에서 얼마나 가까운가? (낮을 수록 좋음. 0이 최선)

  • Inertia
  • Davies-Bouldin Index

다른 군집과 얼마나 다른가? (높을 수록 좋음)

  • Calinski-Harabasz Index
  • Silhouette Coefficient

Inertia

군집 내 제곱합(within-cluster sum-of-squares): "각 클러스터의 중심에서부터의 거리"

$$ \sum_{i} |x_{i} - μ_{i}|^2 $$
  • xi: i번째 x
  • μi: i번째 x가 속한 클러스터의 평균

Scree plot

기울기가 완만해지는 지점에서 k를 결정

k를 늘려도 더이상 inertia를 크게 줄이기 어려운 지점

엄밀한 근거는 없음(분석가의 감..^^)

In [33]:
import matplotlib.pyplot as plt 
wcss = []
ks = list(range(2,11)) 
for k in ks: 
    kmeans = KMeans(n_clusters=k, random_state=0).fit(X)
    wcss.append(kmeans.inertia_)
plt.plot(ks, wcss)
Out[33]:
[<matplotlib.lines.Line2D at 0x2a3304742c8>]

elbow method

클러스터링의 평가

  • 앞에서 소개한 지표들은 k-Means와 같이 각 군집의 주변에 사례들이 볼록(convex)하게 분포하는 경우에만 유효
  • DBSCAN 등에서는 적절한 기준이 되지 못함
  • 클러스터링의 결과를 바탕으로 행동을 취했을 때 그 성과로 판단해야

k-Means 군집분석 실습

클러스터링 데이터의 scree plot을 그려보세요.

군집은 몇 개 정도가 적당해 보입니까?

In [34]:
cl = pd.read_excel('cluster.xlsx', index_col=0) # unnamed: 0 column 제거
In [35]:
cl.head()
Out[35]:
x1 x2
0 0.836857 2.136359
1 -1.413658 7.409623
2 1.155213 5.099619
3 -1.018616 7.814915
4 1.271351 1.892542
In [36]:
px.scatter(cl,'x1','x2')
In [37]:
wcss = []
for k in ks: 
    kmeans = KMeans(n_clusters=k, random_state=0).fit(cl)
    wcss.append(kmeans.inertia_)
plt.plot(ks, wcss)
Out[37]:
[<matplotlib.lines.Line2D at 0x2a33055e748>]

정답: 4

군집을 4개로 나누었을 때 inertia는 얼마입니까?

In [38]:
wcss
Out[38]:
[1190.7823593643448,
 546.8911504626299,
 212.00599621083478,
 188.7732355677372,
 170.72930303135,
 152.58511017298733,
 138.39719387330848,
 124.45515950322834,
 113.13267210634592]

정답: 212.00599621083478